(圖源:DaemonSet | Google Kubernetes Engine (GKE) | Google Cloud)
在前幾天我們講了在各個node部署時會用到的Deployment、單次的批次工作的Job以及定期性的批次工作 CronJob,但若我們想要在每個node都執行一個特定的pod (adhere to a one-Pod-per-node model),像是日誌搜集系統、監測系統
,利用上述工具便會變得有些複雜,這個時候,我們就可以使用自1.2版開始支援的資源物件 - DaemonSet
,讓我們快速做到這件事情,以下為k8s官方docs中提到的使用情境:
和其他的資源類型、排程器一樣,都是用 YAML 檔去撰寫DaemonSet的配置內容,以下為官方提供的一個 DaemonSet 範例
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: kube-system
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
tolerations:
# these tolerations are to have the daemonset runnable on control plane nodes
# remove them if your control plane nodes should not run pods
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
containers:
- name: fluentd-elasticsearch
image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
完成後依樣使用apply命令便可部署
kubectl apply -f <YAML檔位置>
.spec.template
:為 必要
的部分,是 daemonSet 在各個 node 建立 pod 時的 pod 模板,其撰寫格式和 pod 的 template 相同.spec.template.metadata.label
:和其他的排程器一樣,必須設置適當的 label 作為 selector使用RestartPolicy
:因為是 DaemonSet 使用,故必須是Always
,上方未設置是因為預設值為Always
.spec.selector
:為 DaemonSet 的 YAML 中另一個必要的項目,用來設置選取的 pod 條件
.spec.template.metadata.label
中設置的一樣,也可以用 matchLabels
或 matchExpression
的方式表示.spec.template.spec.nodeSelector
,若設置了這條,則 DaemonSet 會在符合條件的 node 上執行 podv1.2前
舊版的DaemonSet controller和kube-scheduler的衝突問題Pending
狀態,但 DaemonSet Pod 不會先進入 Pending 狀態,這樣的過程可能會讓使用者混淆)v1.2後
經過以上的解釋應該就可以了解daemonSet的作用、和看懂上面YAML檔的內容了,但在最後面有個
tolerations
的部分,還沒有提到,那就是明天的主題啦
DaemonSet | Kubernetes
DaemonSet | Google Kubernetes Engine (GKE) | Google Cloud